package msg2nats

import (
	"encoding/json"
	"fmt"
	"time"
)

type MsgFormat int32

const (
	MSG_FORMAT_JSON MsgFormat = iota
	MSG_FORMAT_PB   MsgFormat = iota + 1
)

type NatsMessage struct {
	Header NatsHeader

	Code   int32
	Msg    string
	Format MsgFormat
	Body   *[]byte // 二进制
	//JsonBody *string
	CheckOk bool
}

func (m *NatsMessage) Ini() {
	m.Header.Ini()
	m.Format = MSG_FORMAT_JSON
}

type NatsHeader struct {
	Topic, Version string

	MsgId    int64
	TraceId  int64
	ParentId int64
	SpanId   int64
}

func (h *NatsHeader) Ini() {
	h.MsgId = time.Now().UTC().UnixNano()
	h.TraceId = time.Now().UTC().UnixNano()
	h.ParentId = time.Now().UTC().UnixNano()
	h.SpanId = time.Now().UTC().UnixNano()

}
func (entity *NatsHeader) String() string {
	s, err := json.Marshal(entity)
	if err != nil {
		fmt.Println(err.Error())
		return "{}"
	}
	return string(s)

}

func (entity *NatsHeader) ToString() string {
	s, err := json.MarshalIndent(entity, "", " ")
	if err != nil {
		fmt.Println(err.Error())
		return "{}"
	}
	return string(s)

}

func (m *NatsMessage) IniData(data []byte) {
	m.Header.Ini()
	m.Body = &data
}

func (entity *NatsMessage) String() string {
	s, err := json.Marshal(entity)
	if err != nil {
		fmt.Println(err.Error())
		return "{}"
	}
	return string(s)

}

func (entity *NatsMessage) ToString() string {
	s, err := json.MarshalIndent(entity, "", " ")
	if err != nil {
		fmt.Println(err.Error())
		return "{}"
	}
	return string(s)

}

func (nm *NatsMessage) GetTopic() string {
	return nm.Header.Topic + nm.Header.Version
}

func (entity *NatsMessage) Unmarshal(body string) error {
	return json.Unmarshal([]byte(body), entity)

}

func (msg *NatsMessage) CheckTopicExist() bool {
	if msg.CheckOk {
		return msg.CheckOk
	}
	//param := dto.NatsTopicQueryParam{}
	//param.Ini()
	//if msg.Header.Version == "" {
	//	msg.Header.Version = DEFAULT_VERSION
	//}
	//param.Param.Topic = &msg.Header.Topic
	//param.Param.Version = &msg.Header.Version
	//
	//result := service.InstNatsTopicService.Query(&param)
	//msg.CheckOk = result.Page.Total > 0
	//if msg.CheckOk {
	//	msg.Header.Version = result.Data[0].GetVersion()
	//	fmt.Printf("主题%s已经定义! \n", msg.GetTopic())
	//}

	return msg.CheckOk
}
